Option Explicit

'################################################################
' Discriptor
' inner join
' 目前只是 DFFilterLeftJoinExecutor 的拷贝
'################################################################

Implements IDFFilterConditionExecutor
Implements IDFFilterJoinExecutor

'################################################################
' Field
'################################################################
' join 连接的 DFFilter
Private parentDFFilter As DFFilter

Private joinCondition As DFFilterCompositeCondition

' 在当前执行器内部，是否存在条件
Private hasCondition As Boolean

'################################################################
' Constructor
'################################################################
Private Sub Class_Initialize()
    hasCondition = False
End Sub

Private Sub Class_Terminate()
End Sub

'################################################################
' Init
'################################################################
Public Sub Init(ByRef jf As DFFilter)
    If jf Is Nothing Then
        Err.Raise 10001, Description:="parameter jf must be not nothing"
        Exit Sub
    End If

    ' 保存 Filter
    Set parentDFFilter = jf

    ' 创建条件执行器
    Set joinCondition = New DFFilterCompositeCondition
End Sub

'################################################################
' Property
'################################################################
' 返回当前 Join 中的 DFFilter
Public Property Get IDFFilterJoinExecutor_JoinFilter() As DFFilter
    Set IDFFilterJoinExecutor_JoinFilter = parentDFFilter
End Property

' 返回当前 Join 中的 DFFilter
Public Property Get IDFFilterConditionExecutor_Filter() As DFFilter
    Set IDFFilterConditionExecutor_Filter = parentDFFilter
End Property

'################################################################
' Function
'################################################################

' ============================================
'  Implements IDFFilterConditionExecutor
' ============================================
' 在执行数据筛选前，执行预处理
' 至少要完成: 调用单 Filter 条件筛选 Filter 内的数据
Public Sub IDFFilterConditionExecutor_preExecute()
    ' 如果没有条件，则不执行预处理
    If hasCondition = False Then
        Exit Sub
    End If

    ' 使用单 Filter 条件筛选 Filter 的可用数据
    joinCondition.extractFilterUsableRowBySingleCondition parentDFFilter
End Sub

' 执行正式的数据筛选处理
Public Function IDFFilterConditionExecutor_execActiveRowCheck() As Boolean
    ' 如果当前执行器没有任何条件，则默认所有数据都符合规则
    If hasCondition = False Then
        IDFFilterConditionExecutor_execActiveRowCheck = True
        Exit Function
    End If

    IDFFilterConditionExecutor_execActiveRowCheck = joinCondition.IDFFilterColCondition_unsafeCheckActiveRowVal
End Function

' 获取当前条件中使用的所有 Filter
' @return HashSet<DFFilter>
Public Function IDFFilterConditionExecutor_getAllFilters() As ISet
    Set IDFFilterConditionExecutor_getAllFilters = joinCondition.IDFFilterColCondition_getAllFilters
    IDFFilterConditionExecutor_getAllFilters.Add parentDFFilter
End Function

' ============================================
'  Implements IDFFilterJoinExecutor 条件生成器
' ============================================
' 添加 And 条件
' @param c 条件对象
Public Sub IDFFilterJoinExecutor_joinAND(ByRef c As IDFFilterColCondition)
    joinCondition.cAND c

    hasCondition = True
End Sub

' 添加 Or 条件
' @param c 条件对象
Public Sub IDFFilterJoinExecutor_joinOR(ByRef c As IDFFilterColCondition)
    joinCondition.cOR c

    hasCondition = True
End Sub